#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020/10/12 21:32
# @Author : youngchaolin


# 1 编写装饰器，在每次执行被装饰函数之前，打印一句“每次执行被装饰函数之前
# 都的经过这里，这里根据需求添加代码”

def wrapper(f):
    def inner(*args,**kwargs):
        # 装饰之前要执行的
        print('每次执行被装饰函数之前都的经过这里，这里根据需求添加代码')
        ret=f(*args,**kwargs)
        # 装饰之后要执行的
        return ret
    return inner

@wrapper
def func1():
    print('我想买凯美瑞')
func1()

# 2 为函数写一个装饰器，把函数的返回值+100然后再返回
def wrapper(f):
    def inner(*args,**kwargs):
        # 装饰之前要执行的
        ret=f(*args,**kwargs)
        # 装饰之后要执行的
        return ret+100
    return inner

@wrapper
def fun1():
    return 100
print(fun1())

# 3 实现一个装饰器，通过一次调用使函数重复执行5次

# 错误写法，return ret会终止循环
# def wrapper(f):
#     def inner(*args,**kwargs):
#         # 装饰之前要执行的
#         for i in range(5):
#             ret=f(*args,**kwargs)
#             # 装饰之后要执行的
#             return ret
#     return inner

# 去掉return返回值
def wrapper(f):
    def inner(*args,**kwargs):
        # 装饰之前要执行的
        for i in range(5):
            f(*args,**kwargs)
            # 装饰之后要执行的
    return inner

@wrapper
def func1():
    print('我为儿子学python')
    return '呵呵了'
func1()

# 4 实现一个装饰器，每次调用函数时，将函数名以及调用此函数的时间节点写入文件中
import time
def wrapper(f):
    def inner(*args,**kwargs):
        # 装饰之前要执行的
        ret=f(*args,**kwargs)
        # 装饰之后要执行的
        # 这里将函数名和执行时的时间节点写入文件
        with open('function.txt',mode='a',encoding='utf8') as file:
            execute_time=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
            print(execute_time)
            # 写入文件 f.__name__就是函数名
            file.write(f'北京时间{execute_time}执行了{f.__name__}'+'\n')
        return ret
    return inner
@wrapper
def eat():
    print('我在吃饭')
@wrapper
def drink():
    print('我在喝酒')
@wrapper
def shit():
    print('我在shit')

eat()
time.sleep(1)
drink()
time.sleep(1)
shit()

# 装饰器也常用在打印日志